package jastgen.generator;

import static jastgen.generator.Helper.*;
import java.io.PrintWriter;
import java.util.*;

import jastgen.CompileException;
import jastgen.nodes.ClassDef;
import jastgen.nodes.Module;

import static jastgen.generator.Generator.*;

class VisitorBodyGenerator implements BodyGenerator {

	private final List<String> visitReturnTypes;
	private final Module node;

	VisitorBodyGenerator(
			final List<String> visitReturnTypes,
			final Module node
		) throws CompileException {

		this.visitReturnTypes = visitReturnTypes;
		this.node = node;
	}

	public void generate(
			final PrintWriter out)
	{
		generateVisitorBody(out, node);
	}

	private void generateVisitorBody(
			final PrintWriter out,
			final Module node)
	{
		out.println("/**");
		out.println(" * 実装するインターフェースの型ごとに別の型を返すVisitor。");
		out.println(" * (インターフェースを実装しないノード型については型ごと)");
		out.println(" * 返す型は型引数で指定する。");
		out.println(" */");

		out.print("public interface Visitor");
		printTypeParams(out, visitReturnTypes);
		out.println("{");

		for(final ClassDef c : node.getClassDefs()) {
			printVisitI(out, c, retTy(c));
		}

		out.println("}");
	}
}
